#ifndef _WX_FILEDIRPICKER_H_
#define _WX_FILEDIRPICKER_H_

#include "wx/button.h"
#include "wx/filedlg.h"
#include "wx/dirdlg.h"

extern const wxEventType wxEVT_COMMAND_DIRPICKER_CHANGED;
extern const wxEventType wxEVT_COMMAND_FILEPICKER_CHANGED;

class wxGenericFileDirButton : public wxButton,
  public wxFileDirPickerWidgetBase {
  public:
    wxGenericFileDirButton() { }
    wxGenericFileDirButton( wxWindow *parent,wxWindowID id,
                            const wxString& label = wxFilePickerWidgetLabel,
                            const wxString& path = wxEmptyString,
                            const wxString &message = wxFileSelectorPromptStr,
                            const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
                            const wxPoint& pos = wxDefaultPosition,
                            const wxSize& size = wxDefaultSize,
                            long style = 0,
                            const wxValidator& validator = wxDefaultValidator,
                            const wxString& name = wxFilePickerWidgetNameStr ) {
      Create( parent, id, label, path, message, wildcard,
              pos, size, style, validator, name );
    }

    virtual ~wxGenericFileDirButton() {}

    virtual wxControl *AsControl() { return this; }

  public:

    virtual wxDialog *CreateDialog() = 0;

    virtual wxWindow *GetDialogParent() { return GetParent(); }

    virtual wxEventType GetEventType() const = 0;

  public:

    bool Create( wxWindow *parent, wxWindowID id,
                 const wxString& label = wxFilePickerWidgetLabel,
                 const wxString& path = wxEmptyString,
                 const wxString &message = wxFileSelectorPromptStr,
                 const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxFilePickerWidgetNameStr );

    void OnButtonClick( wxCommandEvent & );

  protected:
    wxString m_message, m_wildcard;
};


#define wxFILEBTN_DEFAULT_STYLE   (wxFLP_OPEN)

class wxGenericFileButton : public wxGenericFileDirButton {
  public:
    wxGenericFileButton() {}
    wxGenericFileButton( wxWindow *parent,
                         wxWindowID id,
                         const wxString& label = wxFilePickerWidgetLabel,
                         const wxString& path = wxEmptyString,
                         const wxString &message = wxFileSelectorPromptStr,
                         const wxString &wildcard = wxFileSelectorDefaultWildcardStr,
                         const wxPoint& pos = wxDefaultPosition,
                         const wxSize& size = wxDefaultSize,
                         long style = wxFILEBTN_DEFAULT_STYLE,
                         const wxValidator& validator = wxDefaultValidator,
                         const wxString& name = wxFilePickerWidgetNameStr ) {
      Create( parent, id, label, path, message, wildcard,
              pos, size, style, validator, name );
    }

  public:     // overrideable

    virtual long GetDialogStyle() const {
      long filedlgstyle = 0;
      if( this->HasFlag( wxFLP_OPEN ) ) {
        filedlgstyle |= wxFD_OPEN;
      }
      if( this->HasFlag( wxFLP_SAVE ) ) {
        filedlgstyle |= wxFD_SAVE;
      }
      if( this->HasFlag( wxFLP_OVERWRITE_PROMPT ) ) {
        filedlgstyle |= wxFD_OVERWRITE_PROMPT;
      }
      if( this->HasFlag( wxFLP_FILE_MUST_EXIST ) ) {
        filedlgstyle |= wxFD_FILE_MUST_EXIST;
      }
      if( this->HasFlag( wxFLP_CHANGE_DIR ) ) {
        filedlgstyle |= wxFD_CHANGE_DIR;
      }
      return filedlgstyle;
    }

    virtual wxDialog *CreateDialog() {
      wxFileDialog *p = new wxFileDialog( GetDialogParent(), m_message,
                                          wxEmptyString, wxEmptyString,
                                          m_wildcard, GetDialogStyle() );
      // this sets both the default folder and the default file of the dialog
      p->SetPath( m_path );
      return p;
    }

    wxEventType GetEventType() const
    { return wxEVT_COMMAND_FILEPICKER_CHANGED; }

  protected:
    void UpdateDialogPath( wxDialog *p ) { wxStaticCast( p, wxFileDialog )->SetPath( m_path ); }
    void UpdatePathFromDialog( wxDialog *p ) { m_path = wxStaticCast( p, wxFileDialog )->GetPath(); }

  private:
    DECLARE_DYNAMIC_CLASS( wxGenericFileButton )
};


//-----------------------------------------------------------------------------
// wxGenericDirButton: a button which brings up a wxDirDialog
//-----------------------------------------------------------------------------

#define wxDIRBTN_DEFAULT_STYLE                     0

class wxGenericDirButton : public wxGenericFileDirButton {
  public:
    wxGenericDirButton() {}
    wxGenericDirButton( wxWindow *parent,
                        wxWindowID id,
                        const wxString& label = wxDirPickerWidgetLabel,
                        const wxString& path = wxEmptyString,
                        const wxString &message = wxDirSelectorPromptStr,
                        const wxPoint& pos = wxDefaultPosition,
                        const wxSize& size = wxDefaultSize,
                        long style = wxDIRBTN_DEFAULT_STYLE,
                        const wxValidator& validator = wxDefaultValidator,
                        const wxString& name = wxDirPickerWidgetNameStr ) {
      Create( parent, id, label, path, message, wxEmptyString,
              pos, size, style, validator, name );
    }

  public:     // overrideable

    virtual long GetDialogStyle() const {
      long dirdlgstyle = wxDD_DEFAULT_STYLE;
      if( this->HasFlag( wxDIRP_DIR_MUST_EXIST ) ) {
        dirdlgstyle |= wxDD_DIR_MUST_EXIST;
      }
      if( this->HasFlag( wxDIRP_CHANGE_DIR ) ) {
        dirdlgstyle |= wxDD_CHANGE_DIR;
      }
      return dirdlgstyle;
    }

    virtual wxDialog *CreateDialog() {
      return new wxDirDialog( GetDialogParent(), m_message, m_path,
                              GetDialogStyle() );
    }

    wxEventType GetEventType() const
    { return wxEVT_COMMAND_DIRPICKER_CHANGED; }

  protected:
    void UpdateDialogPath( wxDialog *p ) { wxStaticCast( p, wxDirDialog )->SetPath( m_path ); }
    void UpdatePathFromDialog( wxDialog *p ) { m_path = wxStaticCast( p, wxDirDialog )->GetPath(); }

  private:
    DECLARE_DYNAMIC_CLASS( wxGenericDirButton )
};


#endif // _WX_FILEDIRPICKER_H_
